home *** CD-ROM | disk | FTP | other *** search
Oberon Document | 1995-08-09 | 8.2 KB | 245 lines | [oODC/obnF] |
- Documents.StdDocumentDesc
- Documents.DocumentDesc
- Containers.ViewDesc
- Views.ViewDesc
- Stores.StoreDesc
- Documents.ModelDesc
- Containers.ModelDesc
- Models.ModelDesc
- Stores.ElemDesc
- TextViews.StdViewDesc
- TextViews.ViewDesc
- TextModels.StdModelDesc
- TextModels.ModelDesc
- TextModels.AttributesDesc
- Helvetica
- Helvetica
- Helvetica
- StdStamps.StdViewDesc
- Helvetica
- Helvetica
- Helvetica
- MODULE NewViews;
- IMPORT Domains, Stores, Ports, Models, Views, Controllers, Properties;
- CONST
- minVersion = 0; maxVersion = 0;
- TYPE
- Model = POINTER TO RECORD (Models.ModelDesc)
- (* model fields *)
- END;
- UpdateMsg = RECORD (Models.UpdateMsg)
- (* message fields *)
- END;
- ModelOp = POINTER TO RECORD (Domains.OperationDesc)
- model: Model;
- (* model-operation fields *)
- END;
- View = POINTER TO RECORD (Views.ViewDesc)
- model: Model;
- (* view fields *)
- END;
- ViewOp = POINTER TO RECORD (Domains.OperationDesc)
- view: View;
- (* view-operation fields *)
- END;
- (* ModelOp *)
- PROCEDURE (op: ModelOp) Do;
- VAR msg: UpdateMsg;
- BEGIN
- (* perform model operation and set up the fields of the update message accordingly *)
- Models.Broadcast(op.model, msg) (* update all views on this model *)
- END Do;
- PROCEDURE NewModelOp (model: Model (* additional parameters *) ): ModelOp;
- VAR op: ModelOp;
- BEGIN
- ASSERT(model # NIL, 20);
- NEW(op);
- (* set up operation parameters *)
- RETURN op
- END NewModelOp;
- (* Model *)
- PROCEDURE (m: Model) Internalize (VAR rd: Stores.Reader);
- VAR version: SHORTINT;
- BEGIN
- (*ASSERT(m is not yet initialized, 20);*)
- m.Internalize^(rd);
- IF ~rd.cancelled THEN
- rd.ReadVersion(minVersion, maxVersion, version);
- IF ~rd.cancelled THEN
- (* read model fields *)
- END
- END
- END Internalize;
- PROCEDURE (m: Model) Externalize (VAR wr: Stores.Writer);
- BEGIN
- (*ASSERT(m is already initialized, 20);*)
- m.Externalize^(wr);
- wr.WriteVersion(maxVersion);
- (* write model fields *)
- END Externalize;
- PROCEDURE (m: Model) InitFrom (source: Models.Model);
- BEGIN
- (*ASSERT(m is not yet initialized, 20);*)
- ASSERT(source # NIL, 21);
- (*ASSERT(source is already initialized, 22);*)
- (* set up empty model *)
- END InitFrom;
- PROCEDURE (m: Model) CopyAllFrom (source: Models.Model);
- BEGIN
- (*ASSERT(m is not yet initialized, 20);*)
- ASSERT(source # NIL, 21);
- (*ASSERT(source is already initialized, 22);*)
- ASSERT(Stores.SameType(m, source), 23);
- WITH source: Model DO
- (* perform deep copy of source *)
- END
- END CopyAllFrom;
- (* ViewOp *)
- PROCEDURE (op: ViewOp) Do;
- BEGIN
- (* perform view operation *)
- Views.Update(op.view, Views.keepFrames) (* restore v in any frame that displays it *)
- END Do;
- PROCEDURE NewViewOp (view: View (* additional parameters *) ): ViewOp;
- VAR op: ViewOp;
- BEGIN
- ASSERT(view # NIL, 20);
- NEW(op);
- (* set up operation parameters *)
- RETURN op
- END NewViewOp;
- (* View *)
- PROCEDURE (v: View) Internalize (VAR rd: Stores.Reader);
- VAR version: SHORTINT; st: Stores.Store;
- BEGIN
- ASSERT(v.model = NIL, 20);
- v.Internalize^(rd);
- IF ~rd.cancelled THEN
- rd.ReadVersion(minVersion, maxVersion, version);
- IF ~rd.cancelled THEN
- rd.ReadStore(st);
- IF (st # NIL) & (st IS Model) THEN
- v.InitModel(st(Model));
- (* read view fields *)
- ELSE
- rd.TurnIntoAlien(Stores.alienComponent) (* cancel internalization of v *)
- END
- END
- END
- END Internalize;
- PROCEDURE (v: View) Externalize (VAR wr: Stores.Writer);
- BEGIN
- ASSERT(v.model # NIL, 20);
- v.Externalize^(wr);
- wr.WriteVersion(maxVersion);
- (* write view fields *)
- END Externalize;
- PROCEDURE (v: View) CopyFrom (source: Views.View);
- BEGIN
- (*ASSERT(v not yet initialized, except for model, 20);*)
- ASSERT(source # NIL, 21);
- ASSERT(Stores.SameType(v, source), 23);
- ASSERT(v.model # NIL, 24);
- v.CopyFrom^(source);
- WITH source: View DO
- ASSERT(source.model # NIL, 22);
- (* copy view fields *)
- IF v.model # source.model THEN
- (*
- Check and possibly update or initialize v's state which refers to its model.
- Example: scroll position is set to a legal value, e.g. to the beginning
- *)
- END
- END
- END CopyFrom;
- PROCEDURE (v: View) InitModel (m: Models.Model);
- BEGIN
- ASSERT(m # NIL, 20);
- (*ASSERT(m already initialized, 21);*)
- ASSERT((v.model = NIL) OR (v.model = m), 22);
- ASSERT(m IS Model, 23);
- v.model := m(Model)
- END InitModel;
- PROCEDURE (v: View) ThisModel (): Models.Model;
- BEGIN
- ASSERT(v.model # NIL, 100);
- RETURN v.model
- END ThisModel;
- PROCEDURE (v: View) Restore (f: Views.Frame; l, t, r, b: LONGINT);
- VAR w, h: LONGINT;
- BEGIN
- (* restore foreground in rectangle (l, t, r, b) *)
- (* replace the body of this procedure with your Restore behavior *)
- v.context.GetSize(w, h);
- f.DrawLine(0, 0, w, h, f.dot, Ports.red)
- END Restore;
- PROCEDURE (v: View) HandleModelMsg (VAR msg: Models.Message);
- BEGIN
- ASSERT(msg.model # NIL, 20); ASSERT(msg.model = v.model, 21);
- WITH msg: Models.UpdateMsg DO
- WITH msg: UpdateMsg DO
- (* calculate bounding box of area to restore, and then call
- Views.UpdateIn(v, l, t, r, b, Views.keepFrames)
- *)
- ELSE
- Views.Update(v, Views.keepFrames) (* restore v in any frame that displays it *)
- END
- ELSE (* ignore other messages *)
- END
- END HandleModelMsg;
- PROCEDURE (v: View) HandleCtrlMsg (f: Views.Frame; VAR msg: Controllers.Message; VAR focus: Views.View);
- BEGIN
- ASSERT(focus = NIL, 23);
- WITH msg: Controllers.PollOpsMsg DO
- (* specify which editing operations are supported *)
- | msg: Controllers.TrackMsg DO
- (* implement mouse tracking *)
- | msg: Controllers.EditMsg DO
- (* implement editing operations *)
- ELSE (* ignore other messages *)
- END
- END HandleCtrlMsg;
- PROCEDURE (v: View) HandlePropMsg (VAR p: Properties.Message);
- CONST defaultWidth = 100 * Ports.mm; defaultHeight = 70 * Ports.mm;
- BEGIN
- WITH p: Properties.FocusPref DO
- p.atLocation := FALSE; p.hotFocus := FALSE; p.setFocus := TRUE; p.selectOnFocus := TRUE
- | p: Properties.SizePref DO
- IF p.w = Views.undefined THEN p.w := defaultWidth END;
- IF p.h = Views.undefined THEN p.h := defaultHeight END
- ELSE (* ignore other messages *)
- END
- END HandlePropMsg;
- (** miscellaneous **)
- PROCEDURE Focus* (): Views.View;
- VAR v: Views.View;
- BEGIN
- v := Controllers.FocusView();
- IF (v # NIL) & (v IS View) THEN RETURN v(View) ELSE RETURN NIL END
- END Focus;
- PROCEDURE New* (): Views.View;
- VAR m: Model; v: View;
- BEGIN
- NEW(m);
- (* initialize model fields *)
- NEW(v); v.InitModel(m);
- (* initialize view fields *)
- RETURN v
- END New;
- PROCEDURE Deposit*;
- BEGIN
- Views.Deposit(New())
- END Deposit;
- END NewViews.
- TextControllers.StdCtrlDesc
- TextControllers.ControllerDesc
- Containers.ControllerDesc
- Controllers.ControllerDesc
- TextRulers.StdRulerDesc
- TextRulers.RulerDesc
- TextRulers.StdStyleDesc
- TextRulers.StyleDesc
- TextRulers.AttributesDesc
- Helvetica
- Documents.ControllerDesc
-